[Terraform]RDS拡張モニタリングのメトリクスをCloudWatchで可視化する

[Terraform]RDS拡張モニタリングのメトリクスをCloudWatchで可視化する

Clock Icon2024.08.15

はじめに

コンサルティング部の神野です。
RDSの拡張モニタリングを有効にすることで、OSのメモリ使用量など追加で取得できるメトリクスが存在します。
拡張モニタリングのメトリクスはRDSコンソールでグラフにして確認は可能ですが、MAX1時間しか可視化することができず、標準メトリクスのようにCloudWatchのグラフで確認することはできません。
本記事では、拡張モニタリングで取得したメトリクスもTerraformを使ってCloudWatchで可視化していきます。

前提

今回はSQL Serverを使用し、ライセンスエディション・エンジンバージョンは下記の通りです。

DBエンジン種類 ライセンスエディション エンジンバージョン
SQL Server Express 16.00.4131.2.v1

構築

今回はTerraformで構築していきます。

前提

Terraformを使用するため事前にインストールが必要になります。
使用したバージョンは下記となります。

  • Terraform・・・v1.9.4(provider registry.terraform.io/hashicorp/aws v5.61.0)

RDS

まずは拡張モニタリングを有効にしたRDSを作成します。拡張モニタリングをTerraformから有効にする際は、IAMロールが別途必要になるため併せて作成し、拡張モニタリング用のマネージドポリシーAmazonRDSEnhancedMonitoringRoleが必要なので作成するロールに紐付けしておきます。
また、拡張モニタリングの詳細度は60秒で出力するようにします。

RDS作成部分
# ---------------------------------------------
# RDS
# ---------------------------------------------
resource "aws_db_instance" "sqlserver_example" {
  identifier        = "mydb-sqlserver-instance"
  # SQL Server Express Edition
  engine            = "sqlserver-ex"
  # 使用したいバージョンに適宜変更してください
  engine_version    = "16.00.4131.2.v1"
    # SQL Serverに適したインスタンスクラス
  instance_class    = "db.t3.micro"
  allocated_storage = 20
  storage_type      = "gp2"
  # 任意のユーザ名
  username          = "XXX"
  # 任意のパスワード
  password          = "XXX"
  license_model     = "license-included"

  # 拡張モニタリングの設定
  monitoring_interval = 60 # 60秒間隔でモニタリング
  monitoring_role_arn = aws_iam_role.rds_monitoring_role.arn

  # SQL Server固有の設定
  port     = 1433
  timezone = "Tokyo Standard Time"

  db_subnet_group_name   = aws_db_subnet_group.rds.name
  vpc_security_group_ids = [aws_security_group.rds.id]

  # マルチAZ設定
  multi_az = false

  # メンテナンスウィンドウ
  maintenance_window = "Sun:20:00-Sun:22:00"

  # パラメータグループとオプショングループ
  parameter_group_name = "default.sqlserver-ex-16.0"
  option_group_name    = "default:sqlserver-ex-16-00"
}

# ---------------------------------------------
# 拡張モニタリング用IAMロール
# ---------------------------------------------
resource "aws_iam_role" "rds_monitoring_role" {
  name = "rds-monitoring-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "monitoring.rds.amazonaws.com"
        }
      }
    ]
  })
}

resource "aws_iam_role_policy_attachment" "rds_monitoring_policy" {
  role       = aws_iam_role.rds_monitoring_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole"
}

CloudWatch

可視化するメトリクスフィルターのコードを書く前に、拡張モニタリングのログ構造を確認します。

拡張モニタリングのログ構造

拡張モニタリングを有効にすると、ロググループRDSOSMetricsにログが格納されています。
今回は利用可能なメモリ量のメトリクスphysAvailKbに注目して、構造を確認します。(後続でメトリクスフィルターを作成する際に参考になります)
個々の項目の詳細については公式ドキュメントを参照していただくといいかと思います。

拡張モニタリングのログ
{
    "engine": "SqlServer",
    "instanceID": "mydb-sqlserver-instance",
    "instanceResourceID": "db-XXXX",
    "timestamp": "2024-08-10T14:26:21Z",
    "version": 1,
    "uptime": "0 days, 02:04:16",
    "numVCPUs": 2,
    "cpuUtilization": {
        "idle": 68.72,
        "kern": 8.74,
        "user": 22.54
    },
    "memory": {
        "commitTotKb": 1548652,
        "commitLimitKb": 2067996,
        "commitPeakKb": 1794628,
        "physTotKb": 1019420,
          // ★今回可視化するメトリクス
        "physAvailKb": 58648,
        "sysCacheKb": 56596,
        "kernTotKb": 272036,
        "kernPagedKb": 151552,
        "kernNonpagedKb": 120484,
        "sqlServerTotKb": 127336,
        "pageSize": 4096
    },
		// その他要素...
}

メトリクスフィルター作成

OS全体で利用可能なメモリ量physAvailKbを可視化できるように、事前に確認したログ構造を元にメトリクスフィルターを作成します。

パターンとして作成したRDSとidentifierが一致するログを取得する、かつphysAvailKbが存在するログとしています。

メトリクスフィルターパターン
$.instanceID = "${aws_db_instance.sqlserver_example.identifier}" && $.memory.physAvailKb > 0
メトリクスフィルター作成部分
# ---------------------------------------------
# メトリクスフィルター(OS利用可能なメモリ)
# ---------------------------------------------
resource "aws_cloudwatch_log_metric_filter" "rds_os_available_memory" {
  name           = "RDSMemoryUsed-${aws_db_instance.sqlserver_example.identifier}"
  pattern        = <<PATTERN
{ $.instanceID = "${aws_db_instance.sqlserver_example.identifier}" && $.memory.physAvailKb > 0 }
PATTERN
  log_group_name = "RDSOSMetrics"

  metric_transformation {
    name      = "PhysicalAvailableMemory"
    namespace = "CustomRDSMetrics"
    value     = "$.memory.physAvailKb"
    unit      = "Kilobytes"
  }
}

動作確認

コードを実行して環境を構築します。
構築後、CloudWatchのダッシュボードで作成したCustomRDSMetrics/PhysicalAvailableMemoryメトリクスが可視化されているか確認してみます。スクリーンショット 2024-08-11 20.53.38カスタムメトリクスの可視化
しっかりと可視化されていますね!

おわりに

拡張モニタリングのメトリクスを可視化する方法はいかがだったでしょうか?
もしTerraformを使って拡張モニタリングのメトリクスを継続的にウォッチしたいとなった際に少しでも参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.